#include "gaia_common.h"
#include "gaia_db.h"
#include "gaia_aes_cbc.h"
#include "cJSON.h"


/*********************************************
 * 函数名：gaia_add_host
 * 用途：添加主机
 * 返回值：0
 * 参数说明：task_id  任务id
 *           uri_buf  接收到的uri
 ********************************************/
int gaia_add_host(int task_id,char *uri_buf)
{
  /* just test */
  //return 0;
  char sign_data[64]; //解密后的字符串

  int hostid,nextid;
  char update_sql[64];
  char sql[256];
  char *tmp_update_sql = "update gaia_ids set nextid=%d"; 
  char *tmp_sql = "insert into gaia_host_info(hostid,username,passwd,host,port) values(%d,'%s','%s','%s',%d)";

  /* 回调数据 */
  char tmp_respo_success[] = "{\"hostid\":%d,\"status\":%s}";
  char tmp_respo_error[] = "{\"status\":%s}";
  char respo_success[64];
  char respo_error[64];

  /* 存放执行过程 */
  char exec_result[1024];
  memset(exec_result,'\0',1024);

  /* 结构体用于存放主机信息 */
  HOST *hostinfo;
  hostinfo  = (HOST *)malloc(sizeof(HOST));

  /* 无法申请内存，造成无法获取主机信息 */
  if(NULL == hostinfo)
  {
    fprintf(stderr,"hostinfo malloc fail!\n");
    sprintf(respo_error,tmp_respo_error,"error");
    gaia_callback(respo_error);
    return 1;
  }


  /* 解析Post过来的数据 */
  gaia_parse_post_data(0,uri_buf,&hostinfo);

  //10%的进度
  printf("10 progress!\n");
  gaia_update_task_status(task_id,10);

  //gaia_write_task_status(unsigned int endtime,int status);

  //printf("hostinfo->sign = %s\n",hostinfo->sign);
  //printf("hostinfo->deploy_type = %s\n",hostinfo->deploy_type);
  //printf("strlen(hostinfo->sign) = %lu\n",sizeof(hostinfo->sign) );

  /* 验签 */
  /*
  gaia_aes_decrypt(sign_data,GAIA_AES_KEY,hostinfo->sign);
  printf("sign_data = %s\n",sign_data);
  */

  //查询nextid
  gaia_DBselect_nextid(0,&hostid);

  nextid = hostid + 1;
  sprintf(update_sql,tmp_update_sql,nextid);

  /* 首先要更新nextid的值 */
  gaia_DBupdate(update_sql);
  //30% progress
  printf("30 progress!\n");
  gaia_update_task_status(task_id,30);

  sprintf(sql,tmp_sql,hostid,hostinfo->username,
          hostinfo->passwd,hostinfo->host,hostinfo->port);
  //60% progress
  printf("60 progress!\n");
  gaia_update_task_status(task_id,60);

  /* 将信息写入数据库 */
  if(gaia_DBinsert(sql))
  {
    fprintf(stderr,"insert error on add host");
    /* 数据库写入失败，释放内存，函数返回 */
    free(hostinfo);
    return 1;
  }

  
  printf("100 progress!\n");
  gaia_update_task_status(task_id,100);


  //以下是添加主机后，对主机初始化的操作，但如果主机无法通的话，容易造成段错误，需要对gaia_remote_operation函数进行改进

  /* 初始化安装yum源 */
  //const char *install_yum = "rpm -ivh http://yum.zrit100.cn/epel-release-6-8.noarch.rpm;rpm -ivh http://yum.zrit100.cn/zrit100-repo-1.0-zrit.x86_64.rpm";

  /* exec_result 回显执行过程 */
  /*
  int rc = gaia_remote_operation(hostinfo->host,hostinfo->username,
                                 hostinfo->passwd,hostinfo->port,install_yum,
                                 exec_result);
  */ 

  /* 失败返回 */
  /*
  if( rc == 1)
  {
    sprintf(respo_error,tmp_respo_error,"error");
    gaia_callback(respo_error);
  }
  */

  /* 成功返回 */
  sprintf(respo_success,tmp_respo_success,hostid,"success");
  gaia_callback(respo_success);
  
  /* 释放内存 */
  free(hostinfo);
  
  return 0;
}
